Ze String na Char

Otázka od: Martin Novák

10. 9. 2002 12:10

Zdravim,
 chtel bych vedet, jak prevedu jedno pismenko z retezce String na
Char. Funkce Copy mi jedno pismenko vybere, ale je to porad
String. Poradte. Jak prevest String o jednom pismenku na Char.
(Delphi 5, Win98SE).

 Dekuji.

 S pozdravem Martin.

--------------------
ZDARMA a RYCHLÉ zasílání SMS z www.posliSMS.cz


Odpovedá: Zbysek Hlinka

10. 9. 2002 10:29

On 10 Sep 2002 at 7:38, Martin Novák wrote:

> chtel bych vedet, jak prevedu jedno pismenko z retezce String na
> Char. Funkce Copy mi jedno pismenko vybere, ale je to porad String.
> Poradte. Jak prevest String o jednom pismenku na Char.

var
  s: string;
  c: char;

  s := 'a';
  c := s[1];

S pozdravem

Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282

Odpovedá: Jiri Wendl, KSH-Data

10. 9. 2002 8:28

Ahoj
Zkus tohle:

var
  s: string;
  z: char;
begin
  s := 'abc';
  z := s[1]; // z obsahuje 'a'
  z := s[2]; // z obsahuje 'b'
  z := s[3]; // z obsahuje 'c'

Jirka

>Zdravim,
> chtel bych vedet, jak prevedu jedno pismenko z retezce String na
>Char. Funkce Copy mi jedno pismenko vybere, ale je to porad
>String. Poradte. Jak prevest String o jednom pismenku na Char.
>(Delphi 5, Win98SE).

> Dekuji.

> S pozdravem Martin.

--------------------
ZDARMA a RYCHLÉ zasílání SMS z www.posliSMS.cz



Odpovedá: Zdenek Brejsa

10. 9. 2002 22:08

> Zdravim,
> chtel bych vedet, jak prevedu jedno pismenko z retezce String na
> Char. Funkce Copy mi jedno pismenko vybere, ale je to porad
> String. Poradte. Jak prevest String o jednom pismenku na Char.

Ja pouzivam kontrukci
S: String
C: Char

C := (S + #0)[1]

protoze pokud by S = '', pak by doslo k vyjimce

Zdenek Brejsa - programator HJ-SOFT s.r.o.
Hradebni 3
56301 Lanskroun
Tel: 511096, 522889, 524795
Mob: 0602592948, 0603833124
ICQ: 47636291

Odpovedá: Petr Vones

10. 9. 2002 15:31

From: "Zdenek Brejsa" <prog@hjsoft.cz>
> Ja pouzivam kontrukci
> S: String
> C: Char
>
> C := (S + #0)[1]

Velmi efektivni zpusob   Proc misto jednoducheho porovnani delky retezce
radeji nealokovat retezec novy, zkopirovat cely obsah predchoziho, pridat
dalsi znak a to vse jen proto, aby jsme jinak prectli jeden byte z toho
stringu.

Petr Vones

Odpovedá: Vymazal Milan

10. 9. 2002 18:51

Hello Martin,

Tuesday, September 10, 2002, 7:38:14 AM, you wrote:

MN> Zdravim,
MN> chtel bych vedet, jak prevedu jedno pismenko z retezce String na
MN> Char. Funkce Copy mi jedno pismenko vybere, ale je to porad
MN> String. Poradte. Jak prevest String o jednom pismenku na Char.
MN> (Delphi 5, Win98SE).

MN> Dekuji.

MN> S pozdravem Martin.

MN> --------------------
MN> ZDARMA a RYCHLÉ zasílání SMS z www.posliSMS.cz

var
  s:string;
  c:char;

  begin

  c:=Pchar(s[1]);

  napr






--
Best regards,
 Vymazal mailto:vymazal.milan@seznam.cz

Odpovedá: Michal

11. 9. 2002 0:33

var s : string;
    c : Char;
begin
  s := '';
  if s <> '' then
    c := s[1];
end;

Odpovedá: Dalibor Toman

10. 9. 2002 18:20

> > C := (S + #0)[1]
>
> Velmi efektivni zpusob   Proc misto jednoducheho porovnani delky
retezce
> radeji nealokovat retezec novy, zkopirovat cely obsah predchoziho,
pridat
> dalsi znak a to vse jen proto, aby jsme jinak prectli jeden byte z
toho
> stringu.
>

Sice je to neefektivni, ale podle mne ne tolik jak popisujes. K nove
alokaci (a kopirovani obsahu puvodniho retezce) nedojde, protoze
stavajici jednoznakovy retezec se urcite da bez realokace bufferu
prodlouzit o jeden znak.  

D. Toman

Odpovedá: Petr Vones

10. 9. 2002 23:35

From: "Dalibor Toman" <dtoman@fortech.cz>
> Sice je to neefektivni, ale podle mne ne tolik jak popisujes. K nove
> alokaci (a kopirovani obsahu puvodniho retezce) nedojde, protoze
> stavajici jednoznakovy retezec se urcite da bez realokace bufferu
> prodlouzit o jeden znak.  

Prelozi se to s volanim _LStrCat3. V nasledujicim testu mi to vychazelo cca
50x pomalejsi:

uses
  JclCounter;

procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
  C: Char;
  Cnt: TJclCounter;
  I: Integer;
  T1, T2: Extended;
begin
  S := '12345';

  StartCount(Cnt);
  for I := 1 to 100000 do
    C := (S + #0)[1];
  T1 := StopCount(Cnt) * 1000;
  Memo1.Lines.Add(C);

  StartCount(Cnt);
  for I := 1 to 100000 do
  begin
    if Length(S) > 0 then
      C := S[1]
    else
      C := #0;
  end;
  T2 := StopCount(Cnt) * 1000;
  Memo1.Lines.Add(C);

  Memo1.Lines.Add(Format('%5.3f %5.3f', [T1, T2]));
end;

Petr Vones

Odpovedá: Dalibor Toman

10. 9. 2002 18:18

> From: "Dalibor Toman" <dtoman@fortech.cz>
> > Sice je to neefektivni, ale podle mne ne tolik jak popisujes. K
nove
> > alokaci (a kopirovani obsahu puvodniho retezce) nedojde, protoze
> > stavajici jednoznakovy retezec se urcite da bez realokace bufferu
> > prodlouzit o jeden znak.  
>
> Prelozi se to s volanim _LStrCat3. V nasledujicim testu mi to
vychazelo cca
> 50x pomalejsi:

Koukal jsem pro jistotu do zdrojaku _LStrCat3 a pri scitani
jednoznakoveho stringa a Charu to nakonec opravdu skonci tak jak jsem
psal (memory manager pri resize nic noveho nenaalokuje) - ale toho
kodu co se mezi tim vykona - hruza.

Ja jsem se samozrejme nechtel zastavat toho zpusobu prevodu Charu na
Stringo - jen jsem do Tebe chtel rejpnout, ze pro jednou nemas tak
uplne pravdu  


D. Toman

Odpovedá: Petr Vones

10. 9. 2002 17:16

From: "Dalibor Toman" <dtoman@fortech.cz>
> Ja jsem se samozrejme nechtel zastavat toho zpusobu prevodu Charu na
> Stringo - jen jsem do Tebe chtel rejpnout, ze pro jednou nemas tak
> uplne pravdu  

No, asi ne jen pro jednou   Ale v tomhle pripade jsem mel namysli hlavne to
volani _NewAnsiString a Move v _LStrAsg, ktery se v tomhle pripade vola z
_LStrCat3.

Petr Vones